package com.valsong.sandbox.mock;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Mock方法匹配规则
 *
 * @author Val Song
 */
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class MockConfig {

    /**
     * 是否开启(必填)
     * 默认值false
     */
    private Boolean enable;


    /**
     * 需要mock的class类(必填)
     */
    private String classPattern;

    /**
     * 是否代理子类(非必填)
     * 默认false
     */
    private Boolean includeSubClasses;

    /**
     * 是否包含被Bootstrap所加载的类(非必填）
     * 默认false
     */
    private Boolean includeBootstrap;


    /**
     * 类是否拥有某一组标注(非必填）
     * <p>
     * 标注组是一个可变参数组，匹配关系为"与"。即：当前类必须同时满足所有标注匹配条件！
     */
    private String[] hasAnnotationTypes;


    /**
     * 类是否声明实现了某一组接口(非必填)
     * <p>
     * 接口组是一个可变参数组，匹配关系为"与"。即：当前类必须同时实现接口模式匹配组的所有接口才能匹配通过
     * </p>
     */
    private String[] hasInterfaceTypes;

    /**
     * 需要mock的方法(必填)
     */
    private String methodPattern;

    /**
     * 需要mock的方法的参数类型(非必填）
     * 出现方法重载时需要填写
     */
    private String[] parameterTypes;


    /**
     * mock过滤器(非必填)
     * 填写的是过滤器Groovy文件的位置
     * 过滤器里面填写的方法名为shouldMock
     * 参数和被拦截方法相同即可
     */
    private String mockFilter;

    /**
     * mock的类型(预留字段)
     * 0 json
     * 1 groovy文件
     */
    private Integer mockInvokerType;

    /**
     * 脚本(必填)
     * <p>
     * mockInvokerType为0 json字符串
     * mockInvokerType为1 groovy文件地址
     */
    private String mockInvoker;

    /**
     * mock脚本的方法名称(非必填)
     * <p>
     * mockInvokerType为0 不需要指定
     * mockInvokerType为1 指定则使用指定名称，不指定则使用mock
     */
    private String mockInvokeMethod;

    /**
     * 最小执行时间(非必填)
     * mock方法的执行时间(毫秒数)，
     * 如果该时间小于实际执行时间，则立即返回
     * 如果该时间大于实际执行时间，则LockSupport.parkNanos( (执行时间-实际执行时间)*1000*1000 )
     */
    private Long minExecutionTime;


    /**
     * 最大执行时间(非必填)
     * mock方法的执行时间(毫秒数)，
     * 如果该时间小于实际执行时间，则立即返回
     * 如果该时间大于实际执行时间，则LockSupport.parkNanos( (执行时间-实际执行时间)*1000*1000 )
     */
    private Long maxExecutionTime;

}
